package Pdfbox;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import org.apache.pdfbox.text.TextPosition;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class PDFBoxUtils {

    /**
     * 获取指定段落的坐标
     *
     * @param filePath    PDF 文件路径
     * @param targetText  目标段落文本
     * @return 目标段落的坐标和尺寸 (x, y, width, height)
     */
    public static String getParagraphCoordinates(String filePath, String targetText) throws IOException {
        File file = new File(filePath);
        PDDocument document = PDDocument.load(file);

        // 自定义 PDFTextStripper，捕获文本坐标
        CustomTextStripper textStripper = new CustomTextStripper();
        textStripper.setSortByPosition(true);
        textStripper.getText(document); // 触发文本提取

        String coordinates = textStripper.getCoordinates(targetText);
        document.close();
        return coordinates;
    }

    /**
     * 根据坐标提取指定区域的文本
     *
     * @param filePath PDF 文件路径
     * @param x        左上角 X 坐标
     * @param y        左上角 Y 坐标
     * @param width    区域宽度
     * @param height   区域高度
     * @return 提取的文本内容
     */
    public static String extractTextByCoordinates(String filePath, float x, float y, float width, float height) throws IOException {
        File file = new File(filePath);
        PDDocument document = PDDocument.load(file);

        // 自定义 PDFTextStripper，捕获文本坐标
        CustomTextStripper textStripper = new CustomTextStripper();
        textStripper.setSortByPosition(true);
        textStripper.getText(document); // 触发文本提取

        String text = textStripper.extractText(x, y, width, height);
        document.close();
        return text;
    }

    /**
     * 自定义 PDFTextStripper，用于捕获文本坐标
     */
    private static class CustomTextStripper extends PDFTextStripper {
        private List<TextPosition> textPositions = new ArrayList<>();

        public CustomTextStripper() throws IOException {
            super();
        }

        @Override
        protected void processTextPosition(TextPosition text) {
            // 捕获每个字符的坐标信息
            textPositions.add(text);
        }

        /**
         * 获取指定段落的坐标
         *
         * @param targetText 目标段落文本
         * @return 目标段落的坐标和尺寸 (x, y, width, height)
         */
        public String getCoordinates(String targetText) {
            StringBuilder currentText = new StringBuilder();
            float x = 0, y = 0, width = 0, height = 0;

            for (TextPosition text : textPositions) {
                currentText.append(text.getUnicode());

                // 如果当前文本包含目标段落
                if (currentText.toString().contains(targetText)) {
                    x = text.getXDirAdj();
                    y = text.getYDirAdj();
                    width = text.getWidthDirAdj();
                    height = text.getHeightDir();
                    break;
                }
            }

            return String.format("Paragraph Coordinates: x=%.2f, y=%.2f, width=%.2f, height=%.2f", x, y, width, height);
        }

        /**
         * 根据坐标提取指定区域的文本
         *
         * @param x      左上角 X 坐标
         * @param y      左上角 Y 坐标
         * @param width  区域宽度
         * @param height 区域高度
         * @return 提取的文本内容
         */
        public String extractText(float x, float y, float width, float height) {
            StringBuilder extractedText = new StringBuilder();

            for (TextPosition text : textPositions) {
                float textX = text.getXDirAdj();
                float textY = text.getYDirAdj();

                // 判断文本是否在指定区域内
                if (textX >= x && textX <= x + width && textY >= y && textY <= y + height) {
                    extractedText.append(text.getUnicode());
                }
            }

            return extractedText.toString();
        }
    }
}